package com.football.gkjo.server;

import java.util.ArrayList;

/**
 * 
 * 이 부분은 서버에서 자체적으로 만드는 채널이다. 클라이언트가 만드는 방의 개념은 아니다. 예를 들어 1. 한국 2. 브라질 3. 이탈리아
 * 4. 네덜란드
 * 
 * 이런식으로의 채널이 구분 되어있다고 보면 된다. 그 안에 또 사람들이 접속할 수 있다.
 *
 */
public class GKJoChannel {

	// 채널의 전체 개수를 체크하기 위한 Static 변수다.
	static int channelSeq;

	// 채널에 접속한 클라이언트들의 목록(채널의 인원 체크를 위해서 만들었다)
	private ArrayList<GKJoServerThread> channelClients;

	// 개설된 매치 목록 (채널마다 매치 목록을 가지고 있기 때문이다)
	private ArrayList<GKJoMatch> matchlist;

	// 채널 이름
	private String channelTitle;

	// 채널 번호
	private int channelNo;

	// 채팅방 번호 (synchronized를 해주려면 객체여야 하기 때문이다.)
	private Integer chatNo;

	// 매치 번호
	private Integer matchNo = 0; // (매치번호는 누적되어야 한다. (중복 방 번호 제거))

	/*
	 * TODO CHANNEL에서 매치 부분 구현해야한다! 방을 만들고 제한 인원을 두어야 하며 / 명령어도 구현해야한다.
	 */

	// 생성자
	public GKJoChannel(String channelTitle) {
		this.channelTitle = channelTitle;
		this.channelClients = new ArrayList<GKJoServerThread>();
		this.matchlist = new ArrayList<GKJoMatch>();
		channelSeq++;
		this.channelNo = channelSeq;
		this.chatNo = 1;
	}
	
//
//	// 매치 등록번호 생성
//	public Integer getMatchNo() {
//		synchronized (this.matchNo) {
//			int i = this.matchNo.intValue();
//			i++;
//			this.matchNo = (Integer) i;
//			return this.matchNo;
//		}
//	}

	// 방을 개설하고 삭제했을 때 방 번호 새롭게 부여
	public void setMatchNumber() {
		for (int i = 0; i < matchlist.size(); i++) {
			matchlist.get(i).setMatchNo(i + 1);
		}
	}

	// 개설한 매치 등록하는 setter
	public void setAddMatchList(GKJoMatch gm) {
		matchlist.add(gm);
	}

	// 개설한 매치 삭제하는 setter
	public void setRemoveMatchList(GKJoMatch gm) {
		matchlist.remove(gm);
	}

	// 채널에 접속한 클라이언트 추가하는 setter
	public void setChannelClients(GKJoServerThread gsThread) {
		channelClients.add(gsThread);
	}

	public void setRemoveClient(GKJoServerThread gsThread) {
		channelClients.remove(gsThread);
	}

	// 접속한 클라이언트의 수 getter
	public int getClientNum() {
		return this.channelClients.size();
	}

	// 채널 번호 getter
	public int getChannelNo() {
		return this.channelNo;
	}

	// 채널 이름 getter
	public String getChannelTitle() {
		return this.channelTitle;
	}

	// 채널의 정보 일정한 포맷으로 getter
	public String getChanelInfo() {
		// return String.format("[%7d] [%20s] [%5d]/[%-5d]", channelNo,
		// channelTitle, getClientNum(), 30);
		return String.format("%-10s %-15s %4s /%4s", String.valueOf(channelNo),
				channelTitle, String.valueOf(getClientNum()),
				String.valueOf(GKJoServerThread.LIMIT_SERVER));
	}

	public ArrayList<GKJoMatch> getMatchList() {
		return this.matchlist;
	}

	// 채널에 개설된 매치의 수 getter
	public int getMatchNum() {
		return this.matchlist.size();
	}

}
